Data Overview
import_data("jake_gyllenhaal")
filmes <- read_imported_data()
filmes %>%
glimpse()
Observations: 20
Variables: 5
$ avaliacao <int> 92, 67, 72, 52, 73, 59, 82, 85, 92, 49, 35, 64, 47, 90, 87, 61, 62, 44, 82, 86
$ filme <chr> "Stronger", "Life", "Nocturnal Animals", "Demolition", "Everest", "Southpaw", "Prisoners", "End of Watch", "Sour...
$ papel <chr> "Jeff Bauman", "David Jordan", "Tony HastingsEdward Sheffield", "Davis Mitchell", "Scott Fischer", "Billy \"The ...
$ bilheteria <dbl> 4.2, 30.2, 10.7, 1.7, 46.6, 42.4, 61.0, 39.1, 54.7, 33.3, 90.8, 28.6, 9.7, 33.0, 83.0, 62.6, 7.5, 186.6, 13.8, 4.2
$ ano <int> 2017, 2017, 2016, 2016, 2015, 2015, 2013, 2012, 2011, 2010, 2010, 2009, 2007, 2007, 2005, 2005, 2005, 2004, 2002...
Box Office
- Data refers to revenue collected inside the USA.
p <- filmes %>%
ggplot(aes(x = ano,
y = bilheteria,
text = paste("Movie:",filme,
"\nBox Office:",
bilheteria,"m",
"\nYear:",ano))) +
geom_point(size = 4, color = paleta[1]) +
labs(y = "Box Office (MM)", x = "Year of release")
ggplotly(p, tooltip = "text") %>%
layout(autosize = F)
Among the movies where Jake acted one sets itself apart from others in terms of revenue: The movie “The Day After Tomorrow” released in 2004.
It’s possible to notice a downward trend in the Box Office of the movies where Jake acted after 2013.
filmes %>%
ggplot(aes(x = bilheteria)) +
geom_histogram(aes(y=(..count..)/sum(..count..)),binwidth = 10, boundary = 0,
fill = "grey", color = "black") +
geom_rug(size = .5) +
scale_x_continuous(breaks=seq(0,200,20)) +
labs(y = "Relative Frequency", x = "Box Office (MM)")

We see a clear disparity between “The Day After Tomorrow” and the rest of the movies.
No values outside expected domain, e.g. negative values.
p <- filmes %>%
ggplot(aes(x = "",
y = bilheteria,
label = filme,
text = paste("Movie:",filme,
"\nBox Office:",
bilheteria,"m"))) +
geom_jitter(width = .05, alpha = .3, size = 3) +
labs(x = "", y="Box Office (MM)")
ggplotly(p, tooltip="text") %>%
layout(autosize = F)
Separate movies in those whose Box Office is below 50 millions and those whose Box Office is above that seems a reasonable approach.
“The Day After Tomorrow” seems to form a group of its own. Which would give us 3 groups.
Rating
p <- filmes %>%
ggplot(aes(x = ano,
y = avaliacao,
text = paste("Movie:",filme,
"\nRating:",
avaliacao,
"\nYear:",ano))) +
geom_point(size = 4, color = paleta[1]) +
scale_y_continuous(limits = c(0, 100)) +
labs(y = "Rating RT", x = "Year of Release")
ggplotly(p, tooltip = "text") %>%
layout(autosize = F)
- Between 2005 and 2010 Jake participated in a particular series of movies that did not please the critics.
- There doesn’t seem to exist a particularly clear tendency in the year of release.
filmes %>%
ggplot(aes(x = avaliacao)) +
geom_histogram(aes(y=(..count..)/sum(..count..)),binwidth = 10, boundary = 0,
fill = paleta[3], color = "black") +
geom_rug(size = .5) +
scale_x_continuous(breaks=seq(0,100,10)) +
labs(y = "Relative Frequency", x = "Rating RT")

It’s possible to notice a considerable number of movies with ratings above 80.
No values outside expected domain, e.g. negative values.
p <- filmes %>%
ggplot(aes(x = "",
y = avaliacao,
text = paste(
"Filme:",filme,
"\nAvaliação:",avaliacao))) +
geom_jitter(width = .05, alpha = .3, size = 3) +
labs(x = "", y="Avaliação RT")
ggplotly(p, tooltip = "text") %>%
layout(autosize = F)
- Intuitively three groups arise:
- The movies with ratings above 80
- The movies with ratings between 55 and 70
- The movies with ratings below 55
LS0tCnRpdGxlOiAiSmFrZSBHeWxsZW5oYWFsJ3MgdHlwZSBvZiBtb3ZpZXMiCnN1YnRpdGxlOiAiQW4gYW5hbHlzaXMgd2l0aCBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyBvbiBkYXRhIGZyb20gSU1EQiBhYm91dCBKYWtlIEd5bGxlbmhhYWwncyBtb3ZpZXMiCmF1dGhvcjogIkpvc8OpIEJlbmFyZGkgZGUgU291emEgTnVuZXMiCmRhdGU6ICIyMi8wNS8yMDE4IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCjxici8+PGJyLz4KCiMgSW50cm9kdWN0aW9uCgo+IEV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgb24gZGF0YSBmcm9tIFtSb3R0ZW5Ub21hdG9lc10oaHR0cHM6Ly93d3cucm90dGVudG9tYXRvZXMuY29tLykgYWJvdXQgYWN0b3IgSmFrZSBHeWxsZW5oYWFsLiBUaGUgY29kZSB1c2VkIHRvIG1pbmUgdGhlIGRhdGEgaGVyZSBhbmFseXplZCBhbmQgdGhlIGV4cGxhbmF0aW9uIG9uIGhvdyB0byB1c2UgaXQgY2FuIGJlIGZvdW5kIG9uIFt0aGlzIHJlcG9ydCdzIHJlcG9zaXRvcnldKGh0dHBzOi8vZ2l0aHViLmNvbS9CZW5hcmRpL2FncnVwYW1lbnRvLWZpbG1lcy8pIGRlc3RlIHJlbGF0w7NyaW8uCgoqIEVudHJpZXMgdGhhdCBoYXZlIG5vIGluZm9ybWF0aW9uIGFib3V0IGJveCBvZmZpY2Ugd2VyZSBpZ25vcmVkLgoKPGJyPgoKKioqCgo8YnI+CgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGNsdXN0ZXIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnZGVuZHJvKQoKc291cmNlKGhlcmU6OmhlcmUoImNvZGUvbGliLlIiKSkKc291cmNlKGhlcmU6OmhlcmUoImNvZGUvcGxvdGFfc29sdWNvZXNfaGNsdXN0LlIiKSkKCnRoZW1lX3NldCh0aGVtZV9yZXBvcnQoKSkKCmtuaXRyOjpvcHRzX2NodW5rJHNldCh0aWR5ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA2LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodCA9IDUsCiAgICAgICAgICAgICAgICAgICAgICBlY2hvID0gVFJVRSkKcGFsZXRhID0gYygiIzQwNEU0RCIsCiAgICAgICAgICAgIiM5MkRDRTUiLAogICAgICAgICAgICIjOTM4QkExIiwKICAgICAgICAgICAiIzJEMzE0MiIsCiAgICAgICAgICAgIiNGNDc0M0IiKQpzZXQuc2VlZCgxMDEpCmBgYAoKIyBEYXRhIE92ZXJ2aWV3CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQppbXBvcnRfZGF0YSgiamFrZV9neWxsZW5oYWFsIikgCmZpbG1lcyA8LSByZWFkX2ltcG9ydGVkX2RhdGEoKQpmaWxtZXMgJT4lIAogICAgZ2xpbXBzZSgpCmBgYAoKIyMgQm94IE9mZmljZQoKKiBEYXRhIHJlZmVycyB0byByZXZlbnVlIGNvbGxlY3RlZCBpbnNpZGUgdGhlIFVTQS4KCmBgYHtyfQpwIDwtIGZpbG1lcyAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFubywgCiAgICAgICAgICAgICAgIHkgPSBiaWxoZXRlcmlhLAogICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vdmllOiIsZmlsbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5Cb3ggT2ZmaWNlOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWxoZXRlcmlhLCJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblllYXI6Iixhbm8pKSkgKyAKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQsIGNvbG9yID0gcGFsZXRhWzFdKSArCiAgICBsYWJzKHkgPSAiQm94IE9mZmljZSAoTU0pIiwgeCA9ICJZZWFyIG9mIHJlbGVhc2UiKQoKZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgICBsYXlvdXQoYXV0b3NpemUgPSBGKQpgYGAKCiogQW1vbmcgdGhlIG1vdmllcyB3aGVyZSBKYWtlIGFjdGVkIG9uZSBzZXRzIGl0c2VsZiBhcGFydCBmcm9tIG90aGVycyBpbiB0ZXJtcyBvZiByZXZlbnVlOiBUaGUgbW92aWUgKioiVGhlIERheSBBZnRlciBUb21vcnJvdyIqKiByZWxlYXNlZCBpbiAyMDA0LgoKKiBJdCdzIHBvc3NpYmxlIHRvIG5vdGljZSBhIGRvd253YXJkIHRyZW5kIGluIHRoZSBCb3ggT2ZmaWNlIG9mIHRoZSBtb3ZpZXMgd2hlcmUgSmFrZSBhY3RlZCBhZnRlciAyMDEzLiAgCgpgYGB7cn0KZmlsbWVzICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGJpbGhldGVyaWEpKSArIAogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9KC4uY291bnQuLikvc3VtKC4uY291bnQuLikpLGJpbndpZHRoID0gMTAsIGJvdW5kYXJ5ID0gMCwgCiAgICAgICAgICAgICAgICAgICBmaWxsID0gImdyZXkiLCBjb2xvciA9ICJibGFjayIpICsgCiAgICBnZW9tX3J1ZyhzaXplID0gLjUpICsKICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjAwLDIwKSkgKwogICAgbGFicyh5ID0gIlJlbGF0aXZlIEZyZXF1ZW5jeSIsIHggPSAiQm94IE9mZmljZSAoTU0pIikKYGBgCgoqIFdlIHNlZSBhIGNsZWFyIGRpc3Bhcml0eSBiZXR3ZWVuICoqIlRoZSBEYXkgQWZ0ZXIgVG9tb3Jyb3ciKiogYW5kIHRoZSByZXN0IG9mIHRoZSBtb3ZpZXMuCgoqIE5vIHZhbHVlcyBvdXRzaWRlIGV4cGVjdGVkIGRvbWFpbiwgZS5nLiBuZWdhdGl2ZSB2YWx1ZXMuCgpgYGB7cn0KcCA8LSBmaWxtZXMgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gIiIsCiAgICAgICAgICAgICAgIHkgPSBiaWxoZXRlcmlhLAogICAgICAgICAgICAgICBsYWJlbCA9IGZpbG1lLAogICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vdmllOiIsZmlsbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5Cb3ggT2ZmaWNlOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWxoZXRlcmlhLCJtIikpKSArIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMDUsIGFscGhhID0gLjMsIHNpemUgPSAzKSArIAogICAgbGFicyh4ID0gIiIsIHk9IkJveCBPZmZpY2UgKE1NKSIpCgpnZ3Bsb3RseShwLCB0b29sdGlwPSJ0ZXh0IikgJT4lIAogICAgbGF5b3V0KGF1dG9zaXplID0gRikKYGBgCgoqIFNlcGFyYXRlIG1vdmllcyBpbiB0aG9zZSB3aG9zZSBCb3ggT2ZmaWNlIGlzIGJlbG93IDUwIG1pbGxpb25zIGFuZCB0aG9zZSB3aG9zZSBCb3ggT2ZmaWNlIGlzIGFib3ZlIHRoYXQgc2VlbXMgYSByZWFzb25hYmxlIGFwcHJvYWNoLiAKCiogKioiVGhlIERheSBBZnRlciBUb21vcnJvdyIqKiBzZWVtcyB0byBmb3JtIGEgZ3JvdXAgb2YgaXRzIG93bi4gV2hpY2ggd291bGQgZ2l2ZSB1cyAzIGdyb3Vwcy4KCiMjIFJhdGluZwoKYGBge3J9CnAgPC0gZmlsbWVzICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGFubywgCiAgICAgICAgICAgICAgIHkgPSBhdmFsaWFjYW8sCiAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vdmllOiIsZmlsbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5SYXRpbmc6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWxpYWNhbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblllYXI6Iixhbm8pKSkgKyAKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQsIGNvbG9yID0gcGFsZXRhWzFdKSAgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSkgKwogICAgbGFicyh5ID0gIlJhdGluZyBSVCIsIHggPSAiWWVhciBvZiBSZWxlYXNlIikKCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JQogICAgbGF5b3V0KGF1dG9zaXplID0gRikKYGBgCgoqIEJldHdlZW4gMjAwNSBhbmQgMjAxMCBKYWtlIHBhcnRpY2lwYXRlZCBpbiBhIHBhcnRpY3VsYXIgc2VyaWVzIG9mIG1vdmllcyB0aGF0IGRpZCBub3QgcGxlYXNlIHRoZSBjcml0aWNzLiAKKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gZXhpc3QgYSBwYXJ0aWN1bGFybHkgY2xlYXIgdGVuZGVuY3kgaW4gdGhlIHllYXIgb2YgcmVsZWFzZS4gCgpgYGB7cn0KZmlsbWVzICU+JSAKICAgIGdncGxvdChhZXMoeCA9IGF2YWxpYWNhbykpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0oLi5jb3VudC4uKS9zdW0oLi5jb3VudC4uKSksYmlud2lkdGggPSAxMCwgYm91bmRhcnkgPSAwLCAKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBwYWxldGFbM10sIGNvbG9yID0gImJsYWNrIikgKyAKICAgIGdlb21fcnVnKHNpemUgPSAuNSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMDAsMTApKSArCiAgICBsYWJzKHkgPSAiUmVsYXRpdmUgRnJlcXVlbmN5IiwgeCA9ICJSYXRpbmcgUlQiKQpgYGAKCiogSXQncyBwb3NzaWJsZSB0byBub3RpY2UgYSBjb25zaWRlcmFibGUgbnVtYmVyIG9mIG1vdmllcyB3aXRoIHJhdGluZ3MgYWJvdmUgODAuCgoqIE5vIHZhbHVlcyBvdXRzaWRlIGV4cGVjdGVkIGRvbWFpbiwgZS5nLiBuZWdhdGl2ZSB2YWx1ZXMuCgpgYGB7cn0KcCA8LSBmaWxtZXMgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gIiIsCiAgICAgICAgICAgICAgIHkgPSBhdmFsaWFjYW8sCiAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZSgKICAgICAgICAgICAgICAgICAgICAiRmlsbWU6IixmaWxtZSwKICAgICAgICAgICAgICAgICAgICAiXG5BdmFsaWHDp8OjbzoiLGF2YWxpYWNhbykpKSArIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMDUsIGFscGhhID0gLjMsIHNpemUgPSAzKSArIAogICAgbGFicyh4ID0gIiIsIHk9IkF2YWxpYcOnw6NvIFJUIikKCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpICU+JSAKICAgIGxheW91dChhdXRvc2l6ZSA9IEYpCgpgYGAKCiogSW50dWl0aXZlbHkgdGhyZWUgZ3JvdXBzIGFyaXNlOgogICAgKiBUaGUgbW92aWVzIHdpdGggcmF0aW5ncyBhYm92ZSA4MAogICAgKiBUaGUgbW92aWVzIHdpdGggcmF0aW5ncyBiZXR3ZWVuIDU1IGFuZCA3MCAKICAgICogVGhlIG1vdmllcyB3aXRoIHJhdGluZ3MgYmVsb3cgNTUKCjxicj4KCioqKgoKPGJyPgoKIyBIaWVyYXJjaGljYWwgQ2x1c3RlcmluZwoKPGJyPgo8YnI+CgojIyBPbmUgZGltZW5zaW9uCgo8YnI+CgojIyMgQm94IE9mZmljZQoKYGBge3J9CmFncnVwYW1lbnRvX2ggPSBmaWxtZXMgJT4lIAogICAgbXV0YXRlKG5vbWUgPSBwYXN0ZTAoZmlsbWUsICIgKGJpbD0iLCBiaWxoZXRlcmlhLCAiKSIpKSAlPiUgCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogICAgY29sdW1uX3RvX3Jvd25hbWVzKCJmaWxtZSIpICU+JSAKICAgIHNlbGVjdChiaWxoZXRlcmlhKSAlPiUKICAgIGRpc3QobWV0aG9kID0gImV1Y2xpZGlhbiIpICU+JSAKICAgIGhjbHVzdChtZXRob2QgPSAiY2VudHJvaWQiKQoKZ2dkZW5kcm9ncmFtKGFncnVwYW1lbnRvX2gsIHJvdGF0ZSA9IFQsIHNpemUgPSAyLCB0aGVtZV9kZW5kcm8gPSBGKSArCiAgICBsYWJzKHkgPSAiRGlzc2ltaWxhcml0eSIsIHggPSAiIiwgdGl0bGUgPSAiRGVuZHJvZ3JhbSIpICsKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBjKDIwLDMwKSwgY29sb3I9YygiNCBncnVwb3MiLCIzIGdydXBvcyIpKSkgKwogICAgc2NhbGVfY29sb3VyX21hbnVhbChuYW1lPSIjR3JvdXBzIiwKICAgIHZhbHVlcz1jKCIjNTZCNEU5IiwgIiNGRjk5OTkiKSkKYGBgCgoqIEluIHRlcm1zIG9mIERlbmRyb2dyYW0gdGhlIHNlcGFyYXRpb24gaW4gZm91ciBhbmQgdGhyZWUgZ3JvdXBzIHNlZW1zIGFwcHJvcHJpYXRlLCBnaXZlbiB0aGF0IHRoZSBpbmNyZWFzZSBpbiBkaXNzaW1pbGFyaXR5IGZyb20gNCB0byAzIGdyb3VwcyBkb2Vzbid0IHNlZW0gdG8gYmUgc3Vic3RhbnRpYWwuCiogQ3V0IG1hZGUgZm9yIDQgZ3JvdXBzCgpgYGB7cn0KYXRyaWJ1aWNvZXMgPSBnZXRfZ3J1cG9zKGFncnVwYW1lbnRvX2gsIG51bV9ncnVwb3MgPSAxOjYpCgphdHJpYnVpY29lcyA9IGF0cmlidWljb2VzICU+JSAKICAgIGxlZnRfam9pbihmaWxtZXMsIGJ5ID0gYygibGFiZWwiID0gImZpbG1lIikpCgphdHJpYnVpY29lcyAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSAiTW92aWVzIiwgeSA9IGJpbGhldGVyaWEsIGNvbG91ciA9IGdydXBvKSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoID0gLjAyLCBoZWlnaHQgPSAwLCBzaXplID0gMS42LCBhbHBoYSA9IC42KSArIAogICAgZmFjZXRfd3JhcCh+IHBhc3RlKGssICIgZ3JvdXBzIikpICsgCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAgIGxhYnMoeSA9ICJCb3ggT2ZmaWNlIChNTSkiLCB4ID0gIiIsIHRpdGxlID0gIkdyb3VwaW5nIGJ5IEJveCBPZmZpY2UiKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKHRpdGxlPSJncm91cCIpKQpgYGAKCiogVGhlIGRpdmlzaW9uIGluIDQgZ3JvdXBzIHNlZW1zIG1vcmUgYXBwcm9wcmlhdGUgdGhhbiB0aGUgZGl2aXNpb24gaW4gMyBncm91cHMuCiAgICAqIFRoZSBtb3ZpZSBjbHVzdGVyIG9uIHRoZSBiYXNlIG9mIGNoYXJ0IHNlZW1zIHRvIHJlcXVpcmUgaXRzIG93biBncm91cCAoSW4gdGhlIDQgZ3JvdXBzIGRpdmlzaW9uIHRoZSBhZm9yZW1lbnRpb25lZCBncm91cCB3b3VsZCBiZSB0aGUgZ3JvdXAgMSkuCgpgYGB7cn0Ka19lc2NvbGhpZG8gPSA0CgptIDwtIGxpc3QobCA9IDIyMCkKCnAgPC1hdHJpYnVpY29lcyAlPiUgCiAgICBmaWx0ZXIoayA9PSBrX2VzY29saGlkbykgJT4lIAogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihsYWJlbCwgYmlsaGV0ZXJpYSksCiAgICAgICAgICAgICAgIHkgPSBiaWxoZXRlcmlhLAogICAgICAgICAgICAgICBjb2xvdXIgPSBncnVwbywKICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKAogICAgICAgICAgICAgICAgICAgICJNb3ZpZToiLCByZW9yZGVyKGxhYmVsLCBiaWxoZXRlcmlhKSwKICAgICAgICAgICAgICAgICAgICAiXG5SYXRpbmc6IiwgYmlsaGV0ZXJpYSwKICAgICAgICAgICAgICAgICAgICAiXG5Hcm91cDoiLCBncnVwbykpKSArIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMDIsIGhlaWdodCA9IDAsIHNpemUgPSAzLCBhbHBoYSA9IC42KSArIAogICAgZmFjZXRfd3JhcCh+IHBhc3RlKGssICIgZ3JvdXBzIikpICsgCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsgCiAgICBsYWJzKHggPSAiIiwgeSA9ICJSYXRpbmcgUlQiKSArIAogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCh0aXRsZT0iZ3JvdXAiKSkgKwogICAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLHRvb2x0aXAgPSAidGV4dCIpICU+JQogICAgbGF5b3V0KGF1dG9zaXplID0gRiwgbWFyZ2luID0gbSkKCmBgYAoKKiAqKlRoZSBEYXkgQWZ0ZXIgVG9tb3Jyb3cqKiBkZW1hbmRlZCBhIGdyb3VwIGZvciBpdHNlbGYsIGFzIGV4cGVjdGVkLgoKPGJyPgoKIyMjIFJhdGluZyAKCmBgYHtyfQphZ3J1cGFtZW50b19oID0gZmlsbWVzICU+JSAKICAgIG11dGF0ZShub21lID0gcGFzdGUwKGZpbG1lLCAiIChhdj0iLCBhdmFsaWFjYW8sICIpIikpICU+JSAKICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICBjb2x1bW5fdG9fcm93bmFtZXMoImZpbG1lIikgJT4lIAogICAgc2VsZWN0KGF2YWxpYWNhbykgJT4lCiAgICBkaXN0KG1ldGhvZCA9ICJldWNsaWRpYW4iKSAlPiUgCiAgICBoY2x1c3QobWV0aG9kID0gIndhcmQuRCIpCgpnZ2RlbmRyb2dyYW0oYWdydXBhbWVudG9faCwgcm90YXRlID0gVCwgc2l6ZSA9IDIsIHRoZW1lX2RlbmRybyA9IEYpICsKICAgIGxhYnMoeSA9ICJEaXNzaW1pbGFyaXR5IiwgeCA9ICIiLCB0aXRsZSA9ICJEZW5kcm9ncmFtIikgKwogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDMwKSxjb2xvcj0icmVkIikKYGBgCgoqIEluIHRlcm1zIG9mIERlbmRyb2dyYW0gdGhlICoqZGl2aXNpb24gaW4gdGhyZWUgZ3JvdXBzIHNlZW1zIHRoZSBtb3N0IGFwcHJvcHJpYXRlKiosIGdpdmVuIHRoYXQgdGhlIGluY3JlYXNlIGluIGRpc3NpbWlsYXJpdHkgYmVjb21lcyBzdWJzdGFudGlhbCB3aGVuIHdlIGdvIGZyb20gMyB0byAyIGdyb3Vwcy4KCmBgYHtyfQphdHJpYnVpY29lcyA9IGdldF9ncnVwb3MoYWdydXBhbWVudG9faCwgbnVtX2dydXBvcyA9IDE6NikKCmF0cmlidWljb2VzID0gYXRyaWJ1aWNvZXMgJT4lIAogICAgbGVmdF9qb2luKGZpbG1lcywgYnkgPSBjKCJsYWJlbCIgPSAiZmlsbWUiKSkKCmF0cmlidWljb2VzICU+JSAKICAgIGdncGxvdChhZXMoeCA9ICJNb3ZpZXMiLCB5ID0gYXZhbGlhY2FvLCBjb2xvdXIgPSBncnVwbykpICsgCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4wMiwgaGVpZ2h0ID0gMCwgc2l6ZSA9IDEuNiwgYWxwaGEgPSAuNikgKyAKICAgIGZhY2V0X3dyYXAofiBwYXN0ZShrLCAiIGdyb3VwcyIpKSArIAogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKHRpdGxlPSJncm91cCIpKSArCiAgICBsYWJzKHkgPSAiUmF0aW5nIFJUIiwgeCA9ICIiLCB0aXRsZSA9ICJHcm91cGluZyBieSBSYXRpbmciKQoKYGBgCgoqIFZpc3VhbGx5IHRoZSBkaXZpc2lvbiBpbiB0aHJlZSBncm91cHMgc2VlbXMgYXBwcm9wcmlhdGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBkZW5kcm9ncmFtLgoKYGBge3J9CmtfZXNjb2xoaWRvID0gMwoKbSA8LSBsaXN0KGwgPSAyMjApCgpwIDwtYXRyaWJ1aWNvZXMgJT4lIAogICAgZmlsdGVyKGsgPT0ga19lc2NvbGhpZG8pICU+JSAKICAgIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiZWwsIGF2YWxpYWNhbyksCiAgICAgICAgICAgICAgIHkgPSBhdmFsaWFjYW8sCiAgICAgICAgICAgICAgIGNvbG91ciA9IGdydXBvLAogICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUoCiAgICAgICAgICAgICAgICAgICAgIk1vdmllOiIsIHJlb3JkZXIobGFiZWwsIGF2YWxpYWNhbyksCiAgICAgICAgICAgICAgICAgICAgIlxuUmF0aW5nOiIsIGF2YWxpYWNhbywKICAgICAgICAgICAgICAgICAgICAiXG5Hcm91cDoiLCBncnVwbykpKSArIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMDIsIGhlaWdodCA9IDAsIHNpemUgPSAzLCBhbHBoYSA9IC42KSArIAogICAgZmFjZXRfd3JhcCh+IHBhc3RlKGssICIgZ3JvdXBzIikpICsgCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsgCiAgICBsYWJzKHggPSAiIiwgeSA9ICJSYXRpbmcgUlQiKSArIAogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCh0aXRsZT0iZ3JvdXAiKSkgKwogICAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLHRvb2x0aXAgPSAidGV4dCIpICU+JQogICAgbGF5b3V0KGF1dG9zaXplID0gRiwgbWFyZ2luID0gbSkKCmBgYAoKKiBBcmd1YWJseSwgKipQcmluY2Ugb2YgUGVyc2lhOiBUaGUgU2FuZHMgb2YgVGltZSoqIGNvdWxkIGRlbWFuZCBhIGdyb3VwIG9mIGl0cyBvd24uCgo8YnI+CgojIyBUd28gZGltZW5zaW9ucwoKPGJyPgoKIyMjIEhvdyBtYW55IGdyb3VwcyBzaG91bGQgd2UgY2hvb3NlPyAKCjxicj4KCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQphZ3J1cGFtZW50b19oXzJkID0gZmlsbWVzICU+JQogICBtdXRhdGUoYmlsaGV0ZXJpYSA9IGxvZzEwKGJpbGhldGVyaWEpKSAlPiUKICAgbXV0YXRlX2F0KHZhcnMoImF2YWxpYWNhbyIsICJiaWxoZXRlcmlhIiksIGZ1bnMoc2NhbGUpKSAlPiUKICAgY29sdW1uX3RvX3Jvd25hbWVzKCJmaWxtZSIpICU+JQogICBzZWxlY3QoImF2YWxpYWNhbyIsICJiaWxoZXRlcmlhIikgJT4lCiAgIGRpc3QobWV0aG9kID0gImV1Y2xpZGVhbiIpICU+JQogICBoY2x1c3QobWV0aG9kID0gIndhcmQuRCIpCgpnZ2RlbmRyb2dyYW0oYWdydXBhbWVudG9faF8yZCwgcm90YXRlID0gVFJVRSwgdGhlbWVfZGVuZHJvID0gRikgKwogICAgbGFicyh5ID0gIkRpc3NpbWlsYXJpdHkiLCB4ID0gIiIsIHRpdGxlID0gIkRlbmRyb2dyYW0iKSArCiAgICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gNCksY29sb3I9InJlZCIpCgpgYGAKCiogR29pbmcgZnJvbSA0IHRvIDMgZ3JvdXBzIHJlcHJlc2VudHMgbGl0dGxlIHZhcmlhdGlvbiBpbiB0ZXJtcyBvZiBkaXNzaW1pbGFyaXR5CiogR29pbmcgZnJvbSAzIHRvIDIgZ3JvdXBzIHJlcHJlc2VudHMgYSByZWxhdGl2ZWx5IHN1YnN0YW50aWFsIGluY3JlYXNlIGluIGRpc3NpbWlsYXJpdHksIHRoZXJlZm9yZSBmcm9tIDYgdG8gMyBncm91cHMgc2VlbXMgYSBnb29kIGNob2ljZSBpbiB0ZXJtcyBvZiBkZW5kcm9ncmFtLgoKYGBge3J9CmZpbG1lczIgPC0gZmlsbWVzICU+JQogICAgbXV0YXRlKGJpbGhldGVyaWEgPSBsb2cxMChiaWxoZXRlcmlhKSkKCnBsb3RhX2hjbHVzdHNfMmQoYWdydXBhbWVudG9faF8yZCwKICAgICAgICAgICAgICAgIGZpbG1lczIsCiAgICAgICAgICAgICAgICBjKCJhdmFsaWFjYW8iLCAiYmlsaGV0ZXJpYSIpLAogICAgICAgICAgICAgICAgbGlua2FnZV9tZXRob2QgPSAid2FyZC5EIiwgCiAgICAgICAgICAgICAgICBrcyA9IDE6NiwKICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiRGFyazIiKSArIAogICAgZmFjZXRfd3JhcCh+IHBhc3RlKGssICIgZ3JvdXBzIikpICsKICAgIHNjYWxlX3lfbG9nMTAoKSArCiAgICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKHRpdGxlPSJncm91cCIpKSArCiAgICBsYWJzKHkgPSAiQm94IE9mZmljZSIsIHggPSAiUmF0aW5nIiwgdGl0bGUgPSAiR3JvdXBpbmcgd2l0aCB0d28gZGltZW5zaW9ucyIpCmBgYAoKKiBUaGUgY2hvaWNlIG9mIDUgZ3JvdXBzIHNlZW1zIGFwcHJvcHJpYXRlLCBhcyBpdCByZWZsZWN0cyBtYXR0ZXJzIG9mIEJveCBPZmZpY2UgYXMgbWF0dGVycyBvZiBSYXRpbmdzLiAqKldlJ2xsIGNob29zZSA1IGdyb3VwcyoqIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnMgKEdyb3VwcyBtZW50aW9uZWQgb24gdGhlIDUgZ3JvdXBzIGRpdmlzaW9uKTogCiAgICAqIFRoZSAkXGNvbG9ye21hZ2VudGF9e1x0ZXh0ezQgYmVzdCByYXRlZCBtb3ZpZXN9fSQgYXJlIHZlcnkgY2xvc2UgdG8gZWFjaCBvdGhlciBhbmQgc3VnZ2VzdCBhIGdyb3VwLgogICAgKiBUaGUgJFxjb2xvcnsjN0MzRjdDfXtcdGV4dHszIG1vdmllcyBvZiBzbWFsbCBCb3ggT2ZmaWNlIGFuZCBsb3cgcmF0aW5nc319JCBhcmUgdmVyeSBkaXNzaW1pbGFyIHRoZSByZXN0IG9mIHRoZSBtb3ZpZXMgYW5kIHN1Z2dlc3QgYSBncm91cC4KICAgICogVGhlICRcY29sb3J7IzE2QTA4NX17XHRleHR7NCBtb3ZpZXMgb2Ygc21hbGwgQm94IE9mZmljZSBhbmQgaGlnaCByYXRpbmdzfX0kIGFyZSBjbG9zZSB0byBlYWNoIG90aGVyIGFuZCBzdWdnZXN0IGEgZ3JvdXAuCiAgICAqIFRoZSAkXGNvbG9ye2dyZWVufXtcdGV4dHsyIG1vdmllcyBvZiBodWdlIEJveCBPZmZpY2UgYW5kIHZlcnkgbG93IHJhdGluZ3N9fSQgYXJlIHZlcnkgZmFyIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1vdmllcyBhbmQgc3VnZ2VzdCBhIGdyb3VwLgogICAgKiBUaGUgJFxjb2xvcnsjQ0Y1MzAwfXtcdGV4dHs2IGNlbnRyYWwvbWVkaWFuIG1vdmllcyBpbiB0ZXJtcyBvZiBCb3ggT2ZmaWNlL1JhdGluZ319JCBhcmUgdmVyeSBjbG9zZSB0byBlYWNoIG90aGVyIGFuZCBzdWdnZXN0IGEgZ3JvdXAuCgpgYGB7cn0KYXRyaWJ1aWNvZXMgPSBnZXRfZ3J1cG9zKGFncnVwYW1lbnRvX2hfMmQsIG51bV9ncnVwb3MgPSAxOjYpCgphdHJpYnVpY29lcyA9IGF0cmlidWljb2VzICU+JSAKICAgIGZpbHRlcihrID09IDUpICU+JQogICAgbXV0YXRlKGZpbG1lID0gbGFiZWwpICU+JSAKICAgIGxlZnRfam9pbihmaWxtZXMsIGJ5ID0gImZpbG1lIikKCnAgPC0gYXRyaWJ1aWNvZXMgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhdmFsaWFjYW8sCiAgICAgICAgICAgICAgIHkgPSBiaWxoZXRlcmlhLAogICAgICAgICAgICAgICBjb2xvdXIgPSBncnVwbywKICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKAogICAgICAgICAgICAgICAgICAgICJNb3ZpZToiLCBmaWxtZSwKICAgICAgICAgICAgICAgICAgICAiXG5Cb3ggT2ZmaWNlOiIsIGJpbGhldGVyaWEsIm1cbiIsCiAgICAgICAgICAgICAgICAgICAgIlJhdGluZzoiLCBhdmFsaWFjYW8pKSkgKyAKICAgIGdlb21faml0dGVyKHdpZHRoID0gLjAyLCBoZWlnaHQgPSAwLCBzaXplID0gMywgYWxwaGEgPSAuNikgKyAKICAgIGZhY2V0X3dyYXAofiBwYXN0ZShrLCAiIGdyb3VwcyIpKSArIAogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgICBzY2FsZV95X2xvZzEwKCkgKwogICAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZCh0aXRsZT0iZ3JvdXAiKSkgKwogICAgbGFicyh5ID0gIkJveCBPZmZpY2UiLCB4ID0gIlJhdGluZyBSVCIpCgoKZ2dwbG90bHkocCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgICBsYXlvdXQoYXV0b3NpemUgPSBGKQpgYGAKCjxicj4KCioqKgoKPGJyPgoKIyMjIFdoYXQgYXJlIHRoZSBuYW1lIG9mIHRoZSBncm91cHM/IAoKPGJyPgoKJFxjb2xvcnsjMTZBMDg1fXtcdGV4dHtHcm91cCAxIChPZGRiYWxsKTp9fSQgX01vdmllcyBvdmVyYWxsIHdlbGwgcmVjZWl2ZWQgYnkgdGhlIHB1YmxpY18sIHdoaWNoIHJlZmxlY3RlZCBvbiBpdHMgbG93IHJldmVudWUuIFRoZSBuYW1lIE9kZGJhbGwgY29tZXMgZnJvbSB0aGUgbGF0ZXIgaW50ZXJlc3Qgb24gdGhlIG1vdmllcyBmcm9tIHBlb3BsZSB3aG8gY29uc2lkZXIgdGhlbXNlbHZlcyBlY2NlbnRyaWMgbm90IHJhcmVseSB0byByZS12YWxpZGF0ZSB0aGVpciBzZW5zZSBvZiBleGNsdXNpdml0eS4KCjxici8+CgokXGNvbG9yeyNDRjUzMDB9e1x0ZXh0e0dyb3VwIDIgKE1hdGluZWUpOn19JCBNb3ZpZXMgb3ZlcmFsbCBfbm90IHNvIHdlbGwgcmVjZWl2ZWQgYnkgdGhlIGNyaXRpY3MgYW5kIG1vcmUgZm9ybXVsYWljXy4gSW4gdGVybXMgb2YgYm94IG9mZmljZSBtb3N0IG9mIHRoZW0gaGFkIGxvdyByZXZlbnVlIGJ1dCB0aGUgbW92aWUgcGFpZCBpdHNlbGYuIFRoZSBuYW1lIE1hdGluZWUgY29tZXMgZnJvbSB0aGUgaWRlYSBvZiB0aGF0IG1vdmllcyB0aGF0IGRpZCBub3QgcGVyZm9ybSB0aGF0IHdlbGwgb3Igc3RvcHBlZCBiZWluZyB0aGUgaG90IHRvcGljIGZvciBhIGxvbmcgdGltZSBvY2N1cHlpbmcgYmVpbmcgYWlyZWQgYnkgdGhhdCB0aW1lLgoKPGJyLz4KCiRcY29sb3J7IzdDM0Y3Q317XHRleHR7R3JvdXAgMyAoRGVtb2xpdGlvbiBvZiBhIGJ1ZGdldCk6fX0kIE1vdmllcyBvdmVyYWxsIF9wb29ybHkgcmVjZWl2ZWQgYnkgYm90aCBjcml0aWNzIGFuZCBwdWJsaWNfLCB3aGljaCByZWZsZWN0ZWQgb24gaXRzIHNtYWxsIEJveCBPZmZpY2UgYW5kIGxvdyByYXRpbmdzLiBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAgaXMgYSB3b3JkcGxheSB3aXRoIHRoZSB2ZXJ5IHNtYWxsIHJldmVudWUgcmVuZGVyZWQgYnkgdGhlIG1vdmllcywgd2hpY2ggImRlbW9saXNoZWQiIHRoZSBpbnZlc3RtZW50IG9mIHRob3NlIHdobyBiZXR0ZWQgaW4gdGhlbS4gCgo8YnIvPgoKJFxjb2xvcnttYWdlbnRhfXtcdGV4dHtHcnVwbyA0IChCcm9rZSBSZWNvcmRzIGFuZCBBd2FyZHMpOn19JCBNb3ZpZXMgX2FjY2xhaW1lZCBieSBjcml0aWNzXyBhbmQgd2hvc2UgYm94IG9mZmljZSB3YXMgZWl0aGVyIHN1Y2Nlc3NmdWwgb3IgYXQgbGVhc3QgZGVjZW50LiBUaGUgbW92aWVzIGluIHRoaXMgZ3JvdXAgaGF2ZSBhIG1vcmUgc2VyaW91cyB0b25lLCB0YWxraW5nIG9mIHNlcmlvdXMgbWF0dGVyIHRoYXQgZnJlcXVlbnRseSBjcmVhdGUgY29udHJvdmVyc3kgKHNlcmlhbCBtdXJkZXJzLCBub24gaGV0ZXJvc2V4dWFsaXR5LCB0ZXJyb3Jpc20uLikuIFRoZSBuYW1lIG9mIHRoZSBncm91cCBpcyBhIHdvcmQgcGxheSB3aXRoIHRoZSBuYW1lIG9mIG9uZSBvZiBpdHMgbW92aWVzIGFuZCB0aGUgc2hlZXIgYW1vdW50IG9mIHByaXplcyB0aGlzIHBhcnRpY3VsYXIgbW92aWUgd29uLiAKCjxici8+CgokXGNvbG9ye2dyZWVufXtcdGV4dHtHcnVwbyA1IChCbG9ja0J1c3RlcnMpOn19JCBNb3ZpZXMgaW4gd2hpY2ggSmFjayBhY3RlZCB0aGF0IHRoZSBjcml0aWNzIGRpZG4ndCBsaWtlIHRoYXQgbXVjaCBidXQgd2hvIGNvbGxlY3RlZCBhIGh1Z2UgYm94IG9mZmljZSwgd2l0aCBhIHJldmVudWUgb24gdGhlIHNjYWxlIG9mIGh1bmRyZWRzIG9mIG1pbGxpb25zLiBUaGUgdGVybSBCbG9ja0J1c3RlciBpcyB1c3VhbGx5IGdpdmVuIHRvIG1vdmllcyB3aG8gYXR0cmFjdCBjcm93ZHMgdG8gdGhlIG1vdmllIHRoZWF0ZXJzLCB3aGljaCBpcyB0aGUgY2FzZSBvZiB0aGUgbW92aWVzIHdobyBiZWxvbmcgdG8gdGhpcyBncm91cC4KCjxicj4KCioqKgoKPGJyLz4KCiMjIyBNb3ZpZS1leGFtcGxlIG9mIGVhY2ggZ3JvdXAgIAoKPGJyLz4KCiRcY29sb3J7IzE2QTA4NX17XHRleHR7R3J1cG8gMSAoT2RkYmFsbCk6fX0kCgoqICoqU3Ryb25nZXIqKjogQmlvZ3JhcGhpY2FsIG1vdmllIGFib3V0ICdKZWZmIEJhdW1hbicsIHZpY3RpbSBvZiB0aGUgQm9zdG9uIHRlcnJvcmlzdCBhdHRhY2sgd2hvIGxvc3QgYm90aCBsZWdzIG9uIHRoZSBleHBsb3Npb24uIFRoZSBmaWxtIHdhcyBhY2NsYWltZWQgYnkgdGhlIGNyaXRpY3Mgd2hvIGNvbXBsaW1lbnRlZCBob3cgd2VsbCBleGVjdXRlZCBhbmQgbW92aW5nIHRoZSBtb3ZpZSB3YXMsIHRoZSBtb3ZpZSB3YXMgYWxzbyBwcmFpc2VkIGZvciBmb2N1c2luZyBvbiBhIHN0b3J5IG9mIG92ZXJjb21pbmcgaW5zdGVhZCBvZiB1c2luZyB0aGUgdHJhZ2VkeSB0byBkbyBmZWFyLW1vbmdlcmluZy4gVGhlIG1vdmllIGhvd2V2ZXIgd2FzIGEgY29tcGxldGUgZmFpbHVyZSBpbiB0ZXJtcyBvZiBib3ggb2ZmaWNlLgoKPGJyLz4KCiRcY29sb3J7I0NGNTMwMH17XHRleHR7R3J1cG8gMiAoTWF0aW5lZSk6fX0kCgoqICoqTGlmZSoqOiBNb3ZpZSBpbiB0aGUgZ2VucmUgc3BhY2lhbCBzY2ktZmksIGhhZCBhIGJveCBvZmZpY2Ugbm90IHRoYXQgZXhwcmVzc2l2ZSBhbmQgdGhlIGNyaXRpY3Mgd2VyZSBlcXVhbGx5IHVuaW5zcGlyZWQuIFdhcyBjb25zaWRlcmVkIGJ5IG1hbnkgd2VsbCBleGVjdXRlZCBidXQgbGl0dGxlIGlubm92YXRpdmUuCgo8YnIvPgoKJFxjb2xvcnsjN0MzRjdDfXtcdGV4dHtHcnVwbyAzIChEZW1vbGl0aW9uIG9mIGEgYnVkZ2V0KTp9fSQgCgoqICoqRGVtb2xpdGlvbioqOiBJbiB0aGlzIG1vdmllIEphY2tzIGFjdHMgYXMgYSBtYW4gYmFjayB0byB3b3JrIGFmdGVyIGxvc2luZyBoaXMgd2lmZSB3aG8gZmluZHMgY29tZm9ydCBpbiB0aGUgY29tcGFueSBvZiBhIHRlbGVtYXJrZXRpbmcgYXR0ZW5kYW50IHdobyBoZSBtZWV0cyB3aGVuIGhlIGNvbXBsYWlucyBhYm91dCBhIHZlbmRpbmcgbWFjaGluZS4gVGhlIG1vdmllIHdhcyBhIGZhaWx1cmUgaW4gdGVybXMgb2YgYm94IG9mZmljZSBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIHJldmlldy4gQ3JpdGljcyBwb2ludGVkIHRoZSBtb3ZpZSBzY3JpcHQgYXMgdGhlIGJpZyBwcm9ibGVtLCB3aGljaCB3YXMgZGVzY3JpYmVkIGFzICdwcmV0ZW5kaW5nIHRvIGJlIHByb2ZvdW5kJyBhbmQgYW50aS1jaGFyaXNtYXRpYy4KICAgIAo8YnIvPgoKJFxjb2xvcnttYWdlbnRhfXtcdGV4dHtHcnVwbyA0IChCcm9rZSBSZWNvcmRzIGFuZCBBd2FyZHMpOn19JAoKKiAqKkJyb2tlYmFjayBNb3VudGFpbioqOiBQcm9iYWJseSBKYWtlIEd5bGxlbmhhYWwncyBiZXN0IHBlcmZvcm1hbmNlIHRpbGwgbm93LCB0aGlzIG1vdmllIHJlbmRlcmVkIEpha2UgYSBPc2NhciBub21pbmF0aW9uIGFuZCByYWlzZWQgYSBsb3Qgb2YgY29udHJvdmVyc3kgZm9yIGNvbnRhaW5pbmcgYSBzZXggc2NlbmUgYmV0d2VlbiB0d28gbWFuLiBUaGUgQWNhZGVteSAocmVzcG9uc2libGUgZm9yIGNob29zaW5nIHRoZSBPc2NhciB3aW5uZXJzKSB3YXMgYWNjdXNlZCBvZiBob21vcGhvYmlhIGZvciBub3QgY2hvb3NpbmcgdGhpcyBtb3ZpZSBhcyB0aGUgd2lubmVyIG9mIEJlc3QgUGljdHVyZSAsIHN0aWxsIEJyb2tlYmFjayBNb3VudGFpbiB3b24gYW5vdGhlciAxNDEgYXdhcmRzIGFuZCAxMjggbm9taW5hdGlvbnMgYWNjb3JkaW5nIHRvIElNREIuIFRoZSBtb3ZpZSB3YXMgY29uc2lkZXJlZCBhIHN1Y2Nlc3MgYm90aCBpbiBib3ggb2ZmaWNlIGFzIGluIHJhdGluZ3MuCgo8YnIvPgoKJFxjb2xvcntncmVlbn17XHRleHR7R3J1cG8gNSAoQmxvY2tCdXN0ZXJzKTp9fSQgCgoqICoqUHJpbmNlIG9mIFBlcnNpYTogVGhlIFNhbmRzIG9mIFRpbWUqKjogQmFzZWQgb24gdGhlIGdhbWUgb2Ygc2FtZSBuYW1lLCBnYW1lIHdoaWNoIG1hbnkgc3RpbGwgY29uc2lkZXIgYSByZWZlcmVuY2UgaW4gcXVhbGl0eSBhbmQgaW5ub3ZhdGlvbi4gVGhlIG1vdmllIGJyb3VnaHQgZGlzYXBwb2ludGVkIGNvbW1lbnRzIGZyb20gYm90aCBjcml0aWNzIGFuZCBmYW5zIHdobyBjdXJpb3VzbHkgZGlkbid0IGZhaWwgdG8gY29udHJpYnV0ZSB0byBpdHMgYm94IG9mZmljZS4K